"""
Фильтр нежельательных слов для чата.
В разработке!

Author: Milinuri Nirvalen
"""

from chiori import Plugin
from libs.chat_control import get_chat, add_warn
from libs.utils import clear_text
import re


p = Plugin(name='чат: спам слова', backend='vk',
	desc='чёрный список строк в сообщении. Например блокировка сылок.',
	args={'pattern':'regex шаблон'})


# handlers
# ========

@p.eventHandler('before')
async def _(event, ctx):
	c = get_chat(event)
	uid = str(event.get('from.id'))

	if c.file_data.get('words') and uid	not in c.file_data['holy_members']:
		pattern = clear_text(event.get('text', ''))
		text = ''
		i = 0

		for w in c.file_data["words"]:
			res = re.findall(w, pattern)
			if res:
				i += len(res)
				text += f'\n-- совподение по шаблону: "{w}" ({len(res)})'

		if text:
			text += '\n\n' + await add_warn(c, event.get('to.profiles'),
				ctx.now+2592000, [uid], i)
			await ctx.message(text)


# commands
# ========

@p.command('wordlist', 'words',
	usage='[text] проверка строки на наличие в чёрном списке',
	check_func={'check_chat':0}, else_func='chioNotAdmin')
async def wordsList(event, ctx):
	c = get_chat(event).file_data["words"]

	text = f'строк в чёрном списке: {len(c)}\n{", ".join(c)}'

	for w in c:
		res = re.findall(w, ctx.sargs)
		if res:
			text += f'\n-- совподение по шаблону: "{w}" ({len(res)})'

	await ctx.message(text)


@p.command('<word(s) add/+/a>',
	usage='<pattern> добавить строку в чёрный список',
	check_func='check_chat', else_func='userNotAdmin')
async def addWord(event, ctx):
	c = get_chat(event)
	if ctx.sargs not in c.file_data["words"]:
		c.file_data["words"].append(ctx.sargs)
		c.save()
		await ctx.message(f'в спам лист добавлено: "{ctx.sargs}"')
	else:
		await ctx.message(f'"{ctx.sargs}" уже находится в спам листе')


@p.command('<del/d/rm word/words>',
	usage='[pattern] удалить строку из чёрного списка',
	check_func='check_chat', else_func='userNotAdmin',)
async def removeWord(event, ctx):
	c = get_chat(event)
	if ctx.sargs in c.file_data["words"]:
		c.file_data["words"].remove(ctx.sargs)
		c.save()
		await ctx.message(f'из спам листа исключено: "{ctx.sargs}"')
	else:
		await ctx.message(f'"{ctx.sargs}" не находится в спам листе')
